Group 6: SIGMA mbha0014 Mayunk Bharadwaj pgre0007 Priscila Grecov

Presentation: TUE 4-6.00PM - order 6 - question Mitch

Our question:

  1. How does relative humidity in Melbourne change throughout the day and year? When is it most uncomfortable to walk around the city (humidity below 30% or above 60%)?

We need just the sensors that measure the relative humidity that are the ones with sensor_id = 5b and sensor_id = 5b.EPA-1hr

library(dplyr)

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
unique(sensor_readingsRH$sensor_id)
[1] "5b.EPA-1h" "5b"       
unique(sensor_readingsRH$month)
 [1] Nov Dec Jan Sep Feb Aug Mar Apr May Jul Jun Oct
Levels: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
apply(sensor_readingsRH, 2, function(x) sum(is.na(x)))
        id    site_id  sensor_id      value local_time       type      units       date  timeStamp       hour      month    hourMin 
         0          0          0          4          0          0          0          0          0          0          0          0 
unique(sensor_readingsRH$site_id)
[1] "arc1045" "arc1046" "arc1047" "arc1048" "arc1050"
unique(sensor_readingsRH$date)
  [1] "2019-11-15" "2019-11-16" "2019-11-18" "2019-11-19" "2019-11-20" "2019-11-17" "2019-11-21" "2019-11-22" "2019-11-23" "2019-11-24"
 [11] "2019-11-25" "2019-11-26" "2019-11-27" "2019-11-28" "2019-11-29" "2019-11-30" "2019-12-01" "2019-12-03" "2019-12-02" "2019-12-04"
 [21] "2019-12-06" "2019-12-07" "2019-12-05" "2019-12-08" "2019-12-09" "2019-12-10" "2019-12-11" "2019-12-12" "2019-12-13" "2019-12-14"
 [31] "2019-12-15" "2019-12-16" "2019-12-17" "2019-12-19" "2019-12-20" "2019-12-18" "2019-12-22" "2019-12-21" "2019-12-23" "2019-12-24"
 [41] "2019-12-25" "2019-12-26" "2019-12-28" "2019-12-29" "2019-12-31" "2019-12-27" "2019-12-30" "2020-01-01" "2020-01-03" "2020-01-02"
 [51] "2020-01-04" "2020-01-05" "2020-01-06" "2020-09-09" "2020-01-07" "2020-01-08" "2020-01-09" "2020-01-10" "2020-01-11" "2020-01-12"
 [61] "2020-01-13" "2020-01-14" "2020-01-16" "2020-01-15" "2020-01-17" "2020-01-18" "2020-01-19" "2020-01-21" "2020-01-22" "2020-01-23"
 [71] "2020-01-24" "2020-01-20" "2020-01-25" "2020-01-26" "2020-01-28" "2020-01-27" "2020-01-29" "2020-01-31" "2020-01-30" "2020-02-02"
 [81] "2020-02-01" "2020-02-03" "2020-02-05" "2020-02-06" "2020-02-07" "2020-02-04" "2020-02-08" "2020-02-09" "2020-02-10" "2020-02-11"
 [91] "2020-02-12" "2020-02-13" "2020-08-18" "2020-02-14" "2020-02-16" "2020-02-17" "2020-02-18" "2020-02-19" "2020-02-20" "2020-02-15"
[101] "2020-02-21" "2020-02-22" "2020-02-23" "2020-02-24" "2020-02-26" "2020-02-25" "2020-09-25" "2020-02-27" "2020-02-29" "2020-03-01"
[111] "2020-02-28" "2020-03-02" "2020-03-03" "2020-03-04" "2020-03-05" "2020-03-06" "2020-03-07" "2020-03-08" "2020-03-09" "2020-03-10"
[121] "2020-08-15" "2020-03-11" "2020-03-13" "2020-03-14" "2020-03-12" "2020-03-15" "2020-03-16" "2020-03-17" "2020-03-18" "2020-03-19"
[131] "2020-03-20" "2020-03-22" "2020-08-08" "2020-03-23" "2020-03-24" "2020-03-25" "2020-03-21" "2020-03-26" "2020-03-28" "2020-03-27"
[141] "2020-03-29" "2020-03-30" "2020-03-31" "2020-04-01" "2020-04-02" "2020-04-03" "2020-04-04" "2020-04-05" "2020-04-06" "2020-04-07"
[151] "2020-04-08" "2020-04-10" "2020-04-09" "2020-04-11" "2020-04-12" "2020-04-13" "2020-04-14" "2020-04-15" "2020-04-16" "2020-04-17"
[161] "2020-04-18" "2020-04-19" "2020-04-20" "2020-04-21" "2020-04-23" "2020-04-22" "2020-04-24" "2020-04-26" "2020-04-25" "2020-04-27"
[171] "2020-04-28" "2020-04-29" "2020-04-30" "2020-05-01" "2020-05-02" "2020-05-04" "2020-05-05" "2020-05-03" "2020-05-07" "2020-05-10"
[181] "2020-05-08" "2020-05-06" "2020-05-13" "2020-05-14" "2020-05-11" "2020-05-09" "2020-05-15" "2020-05-16" "2020-05-17" "2020-05-12"
[191] "2020-05-18" "2020-05-19" "2020-05-20" "2020-05-21" "2020-05-22" "2020-05-23" "2020-07-27" "2020-05-24" "2020-05-25" "2020-05-26"
[201] "2020-05-27" "2020-05-28" "2020-05-29" "2020-05-30" "2020-05-31" "2020-06-01" "2020-06-02" "2020-06-03" "2020-06-04" "2020-06-05"
[211] "2020-06-06" "2020-06-07" "2020-06-08" "2020-06-09" "2020-06-10" "2020-06-11" "2020-06-12" "2020-06-13" "2020-06-14" "2020-06-15"
[221] "2020-06-16" "2020-06-17" "2020-06-18" "2020-06-19" "2020-06-20" "2020-06-21" "2020-06-22" "2020-06-23" "2020-06-24" "2020-06-25"
[231] "2020-07-31" "2020-07-03" "2020-06-28" "2020-08-25" "2020-07-01" "2020-07-13" "2020-08-22" "2020-07-10" "2020-07-15" "2020-07-22"
[241] "2020-07-19" "2020-07-18" "2020-07-25" "2020-07-28" "2020-08-06" "2020-06-30" "2020-07-09" "2020-07-12" "2020-07-16" "2020-07-04"
[251] "2020-08-03" "2020-07-08" "2020-08-09" "2020-08-12" "2020-07-30" "2020-07-05" "2020-07-06" "2020-07-07" "2020-07-02" "2020-06-26"
[261] "2020-06-29" "2020-06-27" "2020-09-05" "2020-07-11" "2020-10-19" "2020-09-01" "2020-08-28" "2020-10-01" "2020-08-02" "2020-07-24"
[271] "2020-09-27" "2020-09-13" "2020-08-14" "2020-09-26" "2020-09-18" "2020-09-22" "2020-07-21" "2020-10-10" "2020-10-06" "2020-10-15"
[281] "2020-08-23" "2020-09-14" "2020-08-26" "2020-07-20" "2020-10-29" "2020-10-24" "2020-07-26" "2020-08-29" "2020-09-10" "2020-07-14"
[291] "2020-10-02" "2020-08-19" "2020-08-17" "2020-08-16" "2020-07-23" "2020-08-30" "2020-07-17" "2020-08-05" "2020-07-29" "2020-10-11"
[301] "2020-08-07" "2020-10-20" "2020-08-04" "2020-08-01" "2020-08-13" "2020-09-02" "2020-08-20" "2020-08-10" "2020-08-11" "2020-09-19"
[311] "2020-09-06" "2020-09-23" "2020-08-27" "2020-10-28" "2020-08-21" "2020-10-25" "2020-09-08" "2020-09-04" "2020-09-17" "2020-08-24"
[321] "2020-10-05" "2020-08-31" "2020-09-21" "2020-09-03" "2020-10-07" "2020-09-15" "2020-09-11" "2020-09-07" "2020-10-14" "2020-10-23"
[331] "2020-10-16" "2020-09-28" "2020-10-18" "2020-10-03" "2020-09-20" "2020-09-24" "2020-09-12" "2020-10-12" "2020-10-30" "2020-09-16"
[341] "2020-10-21" "2020-10-08" "2020-10-09" "2020-09-29" "2020-10-04" "2020-10-27" "2020-10-17" "2020-10-13" "2020-10-26" "2020-09-30"
[351] "2020-10-22"

1ST) HOW RELATIVITY HUMIDITY CHANGE THROUGH THE YEAR - EXPLORING THE DATA BY MONTH OVER THE YEAR

By the graph below, the different sensors show the same pattern over the year. Then, we can join all the sensors taken the average or median.

Just three days during all the year presented daily average below 30%: 21/11/2019, 20/12/2019, 30/01/2020.

sensor_readingsRH %>%
  filter(sensor_id == "5b.EPA-1h") %>%
  group_by(site_id, month) %>%
  summarise(median_RH = median(value), .groups = 'drop') %>%
  ggplot(aes(x=month, y=median_RH, group=site_id, color=site_id)) +
  geom_line() +
  theme_ipsum() 

sensor_readingsRH %>%
  filter(sensor_id == "5b.EPA-1h") %>%
  group_by(month) %>%
  summarise(mean_RH = mean(value), median_RH = median(value), .groups = 'drop') %>%
  ggplot(aes(x=month, group = 1)) +
  geom_line(aes(y=mean_RH), color="blue") +
  geom_line(aes(y=median_RH), color="red") +
  theme_ipsum() 

sensor_readingsRH %>%
  filter(sensor_id == "5b.EPA-1h") %>%
  group_by(month) %>%
  summarise(mean_RH = mean(value), median_RH = median(value), .groups = 'drop') %>%
  filter(mean_RH >= 70 | median_RH >= 70)

The months of May to August are the worst moths where the RH averages are greater than 70%. November seems to be the month with the lowest RH average (but in this dataset we have just the 2nd half data for November).

sensor_readingsRH %>%
  filter(sensor_id == "5b.EPA-1h") %>%
  group_by(month) %>%
  summarise(mean_RH = mean(value), median_RH = median(value), .groups = 'drop')

2ND) HOW RELATIVITY HUMIDITY CHANGE THROUGH THE DAY - EXPLORING THE DATA BY HOUR OVER THE DAY.

sensor_readingsRH %>%
  filter(sensor_id == "5b.EPA-1h") %>%
  group_by(site_id, hour) %>%
  summarise(mean_RH = mean(value), .groups = 'drop') %>%
  ggplot(aes(x=hour, y=mean_RH, group=site_id, color=site_id)) +
  geom_line() +
  theme_ipsum() +
  scale_x_continuous(breaks = seq(0,23,1))

sensor_readingsRH %>%
  filter(sensor_id == "5b.EPA-1h") %>%
  group_by(hour) %>%
  summarise(mean_RH = mean(value), median_RH = median(value), .groups = 'drop') %>%
  ggplot(aes(x=hour)) +
  geom_line(aes(y=mean_RH), color="blue") +
  geom_line(aes(y=median_RH), color="red") +
  geom_line(aes(y=70), color="black", linetype = "dashed") +
  geom_line(aes(y=30), color="purple", linetype = "dashed") +
  theme_ipsum() +
  scale_x_continuous(breaks = seq(0,23,1))

library(plotly)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout
facet1 <- sensor_readingsRH %>%
  filter(sensor_id == "5b.EPA-1h") %>%
  group_by(month, hour) %>%
  summarise(mean_RH = mean(value), median_RH = median(value), .groups = 'drop') %>%
  ggplot(aes(x=hour)) +
  geom_line(aes(y=mean_RH), color="blue") +
  geom_line(aes(y=median_RH), color="red") +
  geom_line(aes(y=70), color="black", linetype = "dotted") +
  geom_line(aes(y=30), color="purple", linetype = "dotted") +
  facet_wrap(vars(month)) +
  scale_x_continuous(breaks = seq(0,23,1)) +
  theme(axis.text.x=element_text(angle=60, hjust=1, size = 7)) 

ggplotly(facet1)  %>%
        config(displayModeBar = F)
`group_by_()` is deprecated as of dplyr 0.7.0.
Please use `group_by()` instead.
See vignette('programming') for more help
This warning is displayed once every 8 hours.
Call `lifecycle::last_warnings()` to see where this warning was generated.
sensor_readingsRH %>%
  filter(sensor_id == "5b.EPA-1h") %>%
  group_by(month, hour) %>%
  summarise(mean_RH = mean(value), median_RH = median(value), .groups = 'drop') %>%
  filter(mean_RH <= 30 | median_RH <= 30)
sensor_readingsRH %>%
  filter(sensor_id == "5b.EPA-1h") %>%
  group_by(hour, month) %>%
  summarise(mean_RH = mean(value), median_RH = median(value), .groups = 'drop') %>%
  ggplot(aes(x=month,  group = 1)) +
  geom_line(aes(y=mean_RH), color="blue") +
  geom_line(aes(y=median_RH), color="red") +
  geom_line(aes(y=70), color="black", linetype = "dashed", size=0.5) +
  geom_line(aes(y=30), color="purple", linetype = "dashed", size=0.5) +
  theme(axis.text.x=element_text(angle=60, hjust=1, size = 7)) +
  facet_wrap(vars(hour)) 

sensor_readingsRH %>%
  filter(sensor_id == "5b") %>%
  filter(!is.na(value)) %>%
  group_by(hourMin2) %>%
  summarise(mean_RH = mean(value), .groups = 'drop') %>%
  ggplot(aes(x=hourMin2)) +
  geom_line(aes(y=mean_RH), color="blue") +
  theme_ipsum() +
  scale_x_time()
LS0tCnRpdGxlOiAiQXNzNCAtIEVUQzU1MjMgLSBSZWxhdGl2aXR5IEh1bWlkaXR5IE1lbGJvdXJuIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpHcm91cCA2OiBTSUdNQQptYmhhMDAxNAlNYXl1bmsgQmhhcmFkd2FqCnBncmUwMDA3CVByaXNjaWxhIEdyZWNvdgoKUHJlc2VudGF0aW9uOiBUVUUgNC02LjAwUE0gLSBvcmRlciA2IC0gcXVlc3Rpb24gTWl0Y2gKCk91ciBxdWVzdGlvbjoKCjQuIEhvdyBkb2VzIHJlbGF0aXZlIGh1bWlkaXR5IGluIE1lbGJvdXJuZSBjaGFuZ2UgdGhyb3VnaG91dCB0aGUgKipkYXkqKiBhbmQgKip5ZWFyKio/ICoqV2hlbioqIGlzIGl0ICoqbW9zdCB1bmNvbWZvcnRhYmxlKiogdG8gd2FsayBhcm91bmQgdGhlIGNpdHkgKGh1bWlkaXR5ICoqYmVsb3cgMzAlKiogb3IgKiphYm92ZSA2MCUqKik/CgpgYGB7ciByZWFkaW5nLWRhdGFzZXRzfQpzZW5zb3JfcmVhZGluZ3MgPC0gcmVhZC5jc3YoIk1pY3JvY2xpbWF0ZV9TZW5zb3JfUmVhZGluZ3MuY3N2IikKc2Vuc29yX2xvY2FsIDwtIHJlYWQuY3N2KCJNaWNyb2NsaW1hdGVfU2Vuc29yX0xvY2F0aW9ucy5jc3YiKQpgYGAKCldlIG5lZWQganVzdCB0aGUgc2Vuc29ycyB0aGF0IG1lYXN1cmUgdGhlIHJlbGF0aXZlIGh1bWlkaXR5IHRoYXQgYXJlIHRoZSBvbmVzIHdpdGggc2Vuc29yX2lkID0gNWIgYW5kIHNlbnNvcl9pZCA9IDViLkVQQS0xaHIKCgpgYGB7ciBmaWx0ZXJpbmctc2Vuc29yfQp1bmlxdWUoc2Vuc29yX3JlYWRpbmdzJHNlbnNvcl9pZCkKCmxpYnJhcnkoZHBseXIpCnNlbnNvcl9yZWFkaW5nc1JIIDwtIHNlbnNvcl9yZWFkaW5ncyAlPiUgZmlsdGVyKHNlbnNvcl9pZCAlaW4lIGMoIjViIiwgIjViLkVQQS0xaCIpKQpgYGAKCmBgYHtyIHNob3dpbmctbmV3dGFibGV9CnVuaXF1ZShzZW5zb3JfcmVhZGluZ3NSSCRzZW5zb3JfaWQpCmBgYAoKYGBge3J9CnNlbnNvcl9yZWFkaW5nc1JIJGRhdGUgPC0gYXMuRGF0ZShzZW5zb3JfcmVhZGluZ3NSSCRsb2NhbF90aW1lKQpzZW5zb3JfcmVhZGluZ3NSSCR0aW1lU3RhbXAgPC0gYXMuUE9TSVhjdChzZW5zb3JfcmVhZGluZ3NSSCRsb2NhbF90aW1lLCBmb3JtYXQgPSAiJVkvJW0vJWQgJUk6JU06JVMgJXAiKQpzZW5zb3JfcmVhZGluZ3NSSCRob3VyIDwtIGFzLm51bWVyaWMoZm9ybWF0KHNlbnNvcl9yZWFkaW5nc1JIJHRpbWVTdGFtcCwgIiVIIikpCnNlbnNvcl9yZWFkaW5nc1JIJG1vbnRoIDwtIGFzLm51bWVyaWMoZm9ybWF0KHNlbnNvcl9yZWFkaW5nc1JIJGRhdGUsICIlbSIpKQpzZW5zb3JfcmVhZGluZ3NSSCRob3VyTWluIDwtIGZvcm1hdChzZW5zb3JfcmVhZGluZ3NSSCR0aW1lU3RhbXAsICIlSDolTSIpCnVuaXF1ZShzZW5zb3JfcmVhZGluZ3NSSCRob3VyKQp1bmlxdWUoc2Vuc29yX3JlYWRpbmdzUkgkbW9udGgpCnVuaXF1ZShzZW5zb3JfcmVhZGluZ3NSSCRob3VyTWluKQoKc2Vuc29yX3JlYWRpbmdzUkgkbW9udGggPC0gZmFjdG9yKG1vbnRoLmFiYltzZW5zb3JfcmVhZGluZ3NSSCRtb250aF0sIGxldmVscyA9IG1vbnRoLmFiYikKdW5pcXVlKHNlbnNvcl9yZWFkaW5nc1JIJG1vbnRoKQoKIyBsaWJyYXJ5KGNocm9uKQojIHNlbnNvcl9yZWFkaW5nc1JIJGhvdXJNaW4yIDwtIGNocm9uKHRpbWVzPXNlbnNvcl9yZWFkaW5nc1JIJGhvdXJNaW4sIGZvcm1hdCA9ICJoOm0iKQojIHNlbnNvcl9yZWFkaW5nc1JIJGhvdXJNaW4yIDwtIGZvcm1hdChzdHJwdGltZShzZW5zb3JfcmVhZGluZ3NSSCRob3VyTWluMiwiJUg6JU06JVMiKSwnJUg6JU0nKQpgYGAKCmBgYHtyfQphcHBseShzZW5zb3JfcmVhZGluZ3NSSCwgMiwgZnVuY3Rpb24oeCkgc3VtKGlzLm5hKHgpKSkKYGBgCgpgYGB7cn0Kc2Vuc29yX3JlYWRpbmdzUkggJT4lIAogIGZpbHRlcihpcy5uYSh2YWx1ZSkpCmBgYAoKYGBge3J9CnVuaXF1ZShzZW5zb3JfcmVhZGluZ3NSSCRzaXRlX2lkKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2dyaWRnZXMpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGhyYnJ0aGVtZXMpCmxpYnJhcnkodmlyaWRpcykKCnVuaXF1ZShzZW5zb3JfcmVhZGluZ3NSSCRkYXRlKQpgYGAKCjFTVCkgSE9XIFJFTEFUSVZJVFkgSFVNSURJVFkgQ0hBTkdFIFRIUk9VR0ggVEhFIFlFQVIgLSBFWFBMT1JJTkcgVEhFIERBVEEgQlkgTU9OVEggT1ZFUiBUSEUgWUVBUgoKYGBge3IgZHVyaW5nLXllYXJ9CnNlbnNvcl9yZWFkaW5nc1JIICU+JQogIGZpbHRlcihzZW5zb3JfaWQgPT0gIjViLkVQQS0xaCIpICU+JQogIGdyb3VwX2J5KHNpdGVfaWQsZGF0ZSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fUkggPSBtZWFuKHZhbHVlKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lCiAgZ2dwbG90KGFlcyh4PWRhdGUsIHk9bWVhbl9SSCwgZ3JvdXA9c2l0ZV9pZCwgY29sb3I9c2l0ZV9pZCkpICsKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9saW5lKGFlcyh5PTYwKSwgY29sb3I9ImJsYWNrIiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGdlb21fbGluZShhZXMoeT0zMCksIGNvbG9yPSJibGFjayIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICB0aGVtZV9pcHN1bSgpICsKICB4bGFiKCIiKSArCiAgc2NhbGVfeF9kYXRlKGRhdGVfbGFiZWxzID0gIiVZLSVtLSVkIiwgZGF0ZV9icmVha3MgID0gIjEwIGRheXMiKSArCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTYwLCBoanVzdD0xLCBzaXplID0gOCkpIApgYGAKQnkgdGhlIGdyYXBoIGJlbG93LCB0aGUgZGlmZmVyZW50IHNlbnNvcnMgc2hvdyB0aGUgc2FtZSBwYXR0ZXJuIG92ZXIgdGhlIHllYXIuIFRoZW4sIHdlIGNhbiBqb2luIGFsbCB0aGUgc2Vuc29ycyB0YWtlbiB0aGUgYXZlcmFnZSBvciBtZWRpYW4uCgpgYGB7cn0Kc2Vuc29yX3JlYWRpbmdzUkggJT4lCiAgZmlsdGVyKHNlbnNvcl9pZCA9PSAiNWIuRVBBLTFoIikgJT4lCiAgZ3JvdXBfYnkoZGF0ZSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fUkggPSBtZWFuKHZhbHVlKSwgbWVkaWFuX1JIID0gbWVkaWFuKHZhbHVlKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lCiAgZ2dwbG90KGFlcyh4PWRhdGUpKSArCiAgZ2VvbV9saW5lKGFlcyh5PW1lYW5fUkgpLCBjb2xvcj0iYmx1ZSIpICsKICAjZ2VvbV9saW5lKGFlcyh5PW1lZGlhbl9SSCksIGNvbG9yPSJyZWQiKSArCiAgZ2VvbV9saW5lKGFlcyh5PTcwKSwgY29sb3I9InJlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2xpbmUoYWVzKHk9MzApLCBjb2xvcj0icmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHhsYWIoIiIpICsKICBzY2FsZV94X2RhdGUoZGF0ZV9sYWJlbHMgPSAiJVktJW0tJWQiLCBkYXRlX2JyZWFrcyAgPSAiMTAgZGF5cyIpICsKICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9NjAsIGhqdXN0PTEsIHNpemUgPSA4KSkgCmBgYApgYGB7cn0Kc2Vuc29yX3JlYWRpbmdzUkggJT4lCiAgZmlsdGVyKHNlbnNvcl9pZCA9PSAiNWIuRVBBLTFoIikgJT4lCiAgZ3JvdXBfYnkoZGF0ZSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fUkggPSBtZWRpYW4odmFsdWUpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9ZGF0ZSwgeT1tZWFuX1JIKSkgKwogIGdlb21fbGluZSgpICsKICBnZW9tX2xpbmUoYWVzKHk9NzApLCBjb2xvcj0icmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fbGluZShhZXMoeT0zMCksIGNvbG9yPSJyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgeGxhYigiIikgKwogIHNjYWxlX3hfZGF0ZShkYXRlX2xhYmVscyA9ICIlWS0lbS0lZCIsIGRhdGVfYnJlYWtzICA9ICIxMCBkYXlzIikgKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT02MCwgaGp1c3Q9MSwgc2l6ZSA9IDgpKSAKYGBgCmBgYHtyfQpzZW5zb3JfcmVhZGluZ3NSSCAlPiUKICBmaWx0ZXIoc2Vuc29yX2lkID09ICI1Yi5FUEEtMWgiKSAlPiUKICBncm91cF9ieShkYXRlKSAlPiUKICBzdW1tYXJpc2UobWVkaWFuX1JIID0gbWVkaWFuKHZhbHVlKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lCiAgZmlsdGVyKG1lZGlhbl9SSCA8PSAzMCkKYGBgCkp1c3QgdGhyZWUgZGF5cyBkdXJpbmcgYWxsIHRoZSB5ZWFyIHByZXNlbnRlZCBkYWlseSBhdmVyYWdlIGJlbG93IDMwJTogMjEvMTEvMjAxOSwgMjAvMTIvMjAxOSwgMzAvMDEvMjAyMC4KCmBgYHtyfQpzZW5zb3JfcmVhZGluZ3NSSCAlPiUKICBmaWx0ZXIoc2Vuc29yX2lkID09ICI1Yi5FUEEtMWgiKSAlPiUKICBncm91cF9ieShzaXRlX2lkLCBtb250aCkgJT4lCiAgc3VtbWFyaXNlKG1lZGlhbl9SSCA9IG1lZGlhbih2YWx1ZSksIC5ncm91cHMgPSAnZHJvcCcpICU+JQogIGdncGxvdChhZXMoeD1tb250aCwgeT1tZWRpYW5fUkgsIGdyb3VwPXNpdGVfaWQsIGNvbG9yPXNpdGVfaWQpKSArCiAgZ2VvbV9saW5lKCkgKwogIHRoZW1lX2lwc3VtKCkgCmBgYAoKCmBgYHtyfQpzZW5zb3JfcmVhZGluZ3NSSCAlPiUKICBmaWx0ZXIoc2Vuc29yX2lkID09ICI1Yi5FUEEtMWgiKSAlPiUKICBncm91cF9ieShtb250aCkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fUkggPSBtZWFuKHZhbHVlKSwgbWVkaWFuX1JIID0gbWVkaWFuKHZhbHVlKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lCiAgZ2dwbG90KGFlcyh4PW1vbnRoLCBncm91cCA9IDEpKSArCiAgZ2VvbV9saW5lKGFlcyh5PW1lYW5fUkgpLCBjb2xvcj0iYmx1ZSIpICsKICBnZW9tX2xpbmUoYWVzKHk9bWVkaWFuX1JIKSwgY29sb3I9InJlZCIpICsKICB0aGVtZV9pcHN1bSgpIApgYGAKYGBge3J9CnNlbnNvcl9yZWFkaW5nc1JIICU+JQogIGZpbHRlcihzZW5zb3JfaWQgPT0gIjViLkVQQS0xaCIpICU+JQogIGdyb3VwX2J5KG1vbnRoKSAlPiUKICBzdW1tYXJpc2UobWVhbl9SSCA9IG1lYW4odmFsdWUpLCBtZWRpYW5fUkggPSBtZWRpYW4odmFsdWUpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUKICBmaWx0ZXIobWVhbl9SSCA+PSA3MCB8IG1lZGlhbl9SSCA+PSA3MCkKYGBgClRoZSBtb250aHMgb2YgTWF5IHRvIEF1Z3VzdCBhcmUgdGhlIHdvcnN0IG1vdGhzIHdoZXJlIHRoZSBSSCBhdmVyYWdlcyBhcmUgZ3JlYXRlciB0aGFuIDcwJS4gTm92ZW1iZXIgc2VlbXMgdG8gYmUgdGhlIG1vbnRoIHdpdGggdGhlIGxvd2VzdCBSSCBhdmVyYWdlIChidXQgaW4gdGhpcyBkYXRhc2V0IHdlIGhhdmUganVzdCB0aGUgMm5kIGhhbGYgZGF0YSBmb3IgTm92ZW1iZXIpLgoKYGBge3J9CnNlbnNvcl9yZWFkaW5nc1JIICU+JQogIGZpbHRlcihzZW5zb3JfaWQgPT0gIjViLkVQQS0xaCIpICU+JQogIGdyb3VwX2J5KG1vbnRoKSAlPiUKICBzdW1tYXJpc2UobWVhbl9SSCA9IG1lYW4odmFsdWUpLCBtZWRpYW5fUkggPSBtZWRpYW4odmFsdWUpLCAuZ3JvdXBzID0gJ2Ryb3AnKQpgYGAKMk5EKSBIT1cgUkVMQVRJVklUWSBIVU1JRElUWSBDSEFOR0UgVEhST1VHSCBUSEUgREFZIC0gRVhQTE9SSU5HIFRIRSBEQVRBIEJZIEhPVVIgT1ZFUiBUSEUgREFZLgoKYGBge3J9CnNlbnNvcl9yZWFkaW5nc1JIICU+JQogIGZpbHRlcihzZW5zb3JfaWQgPT0gIjViLkVQQS0xaCIpICU+JQogIGdyb3VwX2J5KHNpdGVfaWQsIGhvdXIpICU+JQogIHN1bW1hcmlzZShtZWFuX1JIID0gbWVhbih2YWx1ZSksIC5ncm91cHMgPSAnZHJvcCcpICU+JQogIGdncGxvdChhZXMoeD1ob3VyLCB5PW1lYW5fUkgsIGdyb3VwPXNpdGVfaWQsIGNvbG9yPXNpdGVfaWQpKSArCiAgZ2VvbV9saW5lKCkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwyMywxKSkKYGBgCmBgYHtyfQpzZW5zb3JfcmVhZGluZ3NSSCAlPiUKICBmaWx0ZXIoc2Vuc29yX2lkID09ICI1Yi5FUEEtMWgiKSAlPiUKICBncm91cF9ieShob3VyKSAlPiUKICBzdW1tYXJpc2UobWVhbl9SSCA9IG1lYW4odmFsdWUpLCBtZWRpYW5fUkggPSBtZWRpYW4odmFsdWUpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9aG91cikpICsKICBnZW9tX2xpbmUoYWVzKHk9bWVhbl9SSCksIGNvbG9yPSJibHVlIikgKwogIGdlb21fbGluZShhZXMoeT1tZWRpYW5fUkgpLCBjb2xvcj0icmVkIikgKwogIGdlb21fbGluZShhZXMoeT03MCksIGNvbG9yPSJibGFjayIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2xpbmUoYWVzKHk9MzApLCBjb2xvcj0icHVycGxlIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwyMywxKSkKYGBgCmBgYHtyfQpsaWJyYXJ5KHBsb3RseSkKZmFjZXQxIDwtIHNlbnNvcl9yZWFkaW5nc1JIICU+JQogIGZpbHRlcihzZW5zb3JfaWQgPT0gIjViLkVQQS0xaCIpICU+JQogIGdyb3VwX2J5KG1vbnRoLCBob3VyKSAlPiUKICBzdW1tYXJpc2UobWVhbl9SSCA9IG1lYW4odmFsdWUpLCBtZWRpYW5fUkggPSBtZWRpYW4odmFsdWUpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9aG91cikpICsKICBnZW9tX2xpbmUoYWVzKHk9bWVhbl9SSCksIGNvbG9yPSJibHVlIikgKwogIGdlb21fbGluZShhZXMoeT1tZWRpYW5fUkgpLCBjb2xvcj0icmVkIikgKwogIGdlb21fbGluZShhZXMoeT03MCksIGNvbG9yPSJibGFjayIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICBnZW9tX2xpbmUoYWVzKHk9MzApLCBjb2xvcj0icHVycGxlIiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGZhY2V0X3dyYXAodmFycyhtb250aCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsMjMsMSkpICsKICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9NjAsIGhqdXN0PTEsIHNpemUgPSA3KSkgCgpnZ3Bsb3RseShmYWNldDEpICAlPiUKICAgICAgICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGKQoKYGBgCgpgYGB7cn0Kc2Vuc29yX3JlYWRpbmdzUkggJT4lCiAgZmlsdGVyKHNlbnNvcl9pZCA9PSAiNWIuRVBBLTFoIikgJT4lCiAgZ3JvdXBfYnkobW9udGgsIGhvdXIpICU+JQogIHN1bW1hcmlzZShtZWFuX1JIID0gbWVhbih2YWx1ZSksIG1lZGlhbl9SSCA9IG1lZGlhbih2YWx1ZSksIC5ncm91cHMgPSAnZHJvcCcpICU+JQogIGZpbHRlcihtZWFuX1JIIDw9IDMwIHwgbWVkaWFuX1JIIDw9IDMwKQpgYGAKYGBge3J9CnNlbnNvcl9yZWFkaW5nc1JIICU+JQogIGZpbHRlcihzZW5zb3JfaWQgPT0gIjViLkVQQS0xaCIpICU+JQogIGdyb3VwX2J5KGhvdXIsIG1vbnRoKSAlPiUKICBzdW1tYXJpc2UobWVhbl9SSCA9IG1lYW4odmFsdWUpLCBtZWRpYW5fUkggPSBtZWRpYW4odmFsdWUpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9bW9udGgsICBncm91cCA9IDEpKSArCiAgZ2VvbV9saW5lKGFlcyh5PW1lYW5fUkgpLCBjb2xvcj0iYmx1ZSIpICsKICBnZW9tX2xpbmUoYWVzKHk9bWVkaWFuX1JIKSwgY29sb3I9InJlZCIpICsKICBnZW9tX2xpbmUoYWVzKHk9NzApLCBjb2xvcj0iYmxhY2siLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplPTAuNSkgKwogIGdlb21fbGluZShhZXMoeT0zMCksIGNvbG9yPSJwdXJwbGUiLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplPTAuNSkgKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT02MCwgaGp1c3Q9MSwgc2l6ZSA9IDcpKSArCiAgZmFjZXRfd3JhcCh2YXJzKGhvdXIpKSAKYGBgCgpgYGB7cn0Kc2Vuc29yX3JlYWRpbmdzUkggJT4lCiAgZmlsdGVyKHNlbnNvcl9pZCA9PSAiNWIiKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHZhbHVlKSkgJT4lCiAgZ3JvdXBfYnkoaG91ck1pbjIpICU+JQogIHN1bW1hcmlzZShtZWFuX1JIID0gbWVhbih2YWx1ZSksIC5ncm91cHMgPSAnZHJvcCcpICU+JQogIGdncGxvdChhZXMoeD1ob3VyTWluMikpICsKICBnZW9tX2xpbmUoYWVzKHk9bWVhbl9SSCksIGNvbG9yPSJibHVlIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHNjYWxlX3hfdGltZSgpCmBgYAoKCgoKCgoKCgoKCgo=